package businessLogic;

import java.util.ArrayList;

import comunications.Client;
import scala40rules.*;
import Graphic.DraftLayout;
import businessLogic.*;
import gameState.*;

public class Test {
	
	public static void main(String[] args) throws Exception {
//		Server server = new Server();
//		server.registryStartup();
//		
//		Thread thread = new Thread();
//		thread.sleep(5000);
		
		// questo dovrebbe essere fatto dal server:
		// 1- creazione dei player ed inserimento nel ring
		Player fede = new Player();
		fede.setName("federica");
		fede.setId(0);
		fede.setIp("192.1");
		fede.setPort(100);
		Player carlo = new Player();
		carlo.setName("carlo");
		carlo.setId(1);
		carlo.setIp("192.2");
		carlo.setPort(101);
		Player andrew = new Player();
		andrew.setName("andrew");
		andrew.setId(2);
		andrew.setIp("192.3");
		andrew.setPort(102);
		
		
		ArrayList<Player> p= new ArrayList<Player>();
		p.add(fede);
		p.add(carlo);
		p.add(andrew);
		
		// (*** SENZA SINGLETON ***)
//		Ring ringCarlo = Ring.getInstance();
//		Ring ringFede = Ring.getInstance();
//		ringCarlo.setRing(p);
//		ringFede.setRing(p);
		
		// (CON SINGLETON)
		Ring ring = Ring.getInstance();
		
		ring.setRing(p);
		
		// 2- creazione del Tavolo (*** SENZA SINGLETON ***)
//		Table t = Table.getInstance();
//		Table tableFede = Table.getInstance();
//		Table tableCarlo = Table.getInstance();
		
		// 2- creazione del Tavolo (CON SINGLETON)
		Table t = Table.getInstance();
		
		// 3- settare opportunamente i campi del Tavolo:
		// ( CON SINGLETON )
		t.resetTableForNewGame(ring);
		
		// (*** SENZA SINGLETON ***)
//		 tableFede.setPlayers(t.getPlayers());
//		 tableFede.setVersion(t.getVersion());
//		 tableFede.setScore(t.getScore());
//		 tableFede.setDealerList(t.getDealerList());
//		 tableFede.setHasLaid(t.getHasLaid());
//		 tableFede.setHeel(t.getHeel());
//		 tableFede.setWell(t.getWell());
//		 tableFede.setWinner(t.getWinner());
//		 
//		 tableCarlo.setPlayers(t.getPlayers());
//		 tableCarlo.setVersion(t.getVersion());
//		 tableCarlo.setScore(t.getScore());
//		 tableCarlo.setDealerList(t.getDealerList());
//		 tableCarlo.setHasLaid(t.getHasLaid());
//		 tableCarlo.setHeel(t.getHeel());
//		 tableCarlo.setWell(t.getWell());
//		 tableCarlo.setWinner(t.getWinner());
		
		// 4- creazione del PlayerActions
		//(*** SENZA SINGLETON ***)
//		PlayerActions fedePA = new PlayerActions(fede, tableFede, ringFede);
//		ringFede.setMe(fede);
//		
//		PlayerActions carloPA = new PlayerActions(carlo, tableCarlo, ringCarlo);
//		ringCarlo.setMe(carlo);
		
		//(CON SINGLETON)
		PlayerActions fedePA = new PlayerActions(fede);
		PlayerActions carloPA = new PlayerActions(carlo);
		PlayerActions andrewPA = new PlayerActions(andrew);
		
		// 5- inizio del gioco
		
		//(*** SENZA SINGLETON ***)
//		tableCarlo.setVersion(-1);
//		tableCarlo.setCurrentPlayer(carlo);
		
		//(CON SINGLETON)
		for(int players=0; players < t.getPlayers().size(); players++){
			CardSet startingCards = new CardSet();
			System.out.println("\nCarte del giocatore "+ t.getPlayer(players).getName() +": ");
			for(int cards=0; cards<13; cards++){
				startingCards.addCard(t.getRandomCardFromHeel());
				System.out.println("Carta "+cards+":"+startingCards.getCard(cards).getSymbol()+" "+startingCards.getCard(cards).getSuit());
			}
			CardSetList csl = new CardSetList();
			csl.addCardSet(startingCards);
			t.addPlayerCards(csl);
		}

		
		//************** PROVE SENZA SINGLETON ********************** 
		
//		System.out.println("\n\n\n ----- TURNO CARLO -----\n\n");
//		carloPA.manageTable(tableCarlo);
//		
//		
//		// --------------- TURNO FEDE ------------------ //
//		
//		System.out.println("\n\n\n----- TURNO FEDE -----\n\n");
//		fedePA.manageTable(tableCarlo);
//
//		// --------------- TURNO CARLO ------------------- //
//		
//		System.out.println("\n\n\n ----- TURNO CARLO -----\n\n");
//		carloPA.manageTable(tableFede);
		
		
		
//		// ************************ PROVA COL SINGLETON *********************** //
//		
//		System.out.println("\n\n FEDE PESCA UNA CARTA ");
//		fedePA.drawFromHeel();
//		
		
		
		fedePA.runGraphic();
		
		fedePA.setCardsOnHands();
		
		int fedePosition = t.getPlayerPosition(fedePA);
		t.setHasLaid(t.getPlayerPosition(andrewPA), true);
		ArrayList<Integer> score = new ArrayList<Integer>();
		score.add(11);
		score.add(50);
		score.add(70);
		t.setScore(score);
		
		ring.removePlayer(carlo);
		System.out.println("  ------- missingPlayers = "+ fedePA.missingPlayers());
		t.updateTableWithAlivePlayers(ring);
		
		t.stampaTuttoTavolo();
		
		
		
//
//		
//		//----------------------- gioco ---------------------------//
//		Card joker_clubs = new Card(14, "Joker", "clubs",true, "src/cards/joker-clubs.png","src/small_cards/joker-clubs.png");
//		Card joker_hearts = new Card(14, "Joker", "hearts",true, "src/cards/joker-hearts.png","src/small_cards/joker-hearts.png");
//		Card joker_diamonds = new Card(14, "Joker", "diamonds",true, "src/cards/joker-diamonds.png","src/small_cards/joker-diamonds.png");
//		Card joker = new Card(14, "Joker", " ",true, "src/cards/joker.png","src/small_cards/joker.png");
//                Card joker2 = new Card(14, "Joker", " ",true, "src/cards/joker.png","src/small_cards/joker.png");
//		
//		Card assoDiFiori = new Card(1,"A", "clubs",true, "src/cards/asso_fiori.png","src/small_cards/asso_fiori.png");
//		Card dueDiFiori = new Card(2,"2", "clubs",true, "src/cards/due_fiori.png","src/small_cards/due_fiori.png");
//		Card treDiFiori = new Card(3,"3", "clubs",true, "src/cards/tre_fiori.png","src/small_cards/tre_fiori.png");
//		Card quattroDiFiori = new Card(4,"4", "clubs",true, "src/cards/quattro_fiori.png","src/small_cards/quattro_fiori.png");
//		Card cinqueDiFiori = new Card(5,"5", "clubs",true, "src/cards/cinque_fiori.png","src/small_cards/cinque_fiori.png");
//		
//		
//		Card assoDiFioriB = new Card(1,"A", "clubs",true, "src/cards/asso_fiori.png","src/small_cards/asso_fiori.png");
//		Card assoDiCuori = new Card(1,"A", "hearts",true, "src/cards/asso_cuori.png","src/small_cards/asso_cuori.png");
//		Card assoDiPicche = new Card(1,"A", "spades",true, "src/cards/asso_picche.png","src/small_cards/asso_picche.png");
//
//		Card dieciDiPicche = new Card(10,"10", "spades",true, "src/cards/dieci_picche.png","src/small_cards/dieci_picche.png");
//		Card jackDiPicche = new Card(11,"J", "spades",true, "src/cards/jack_picche.png","src/small_cards/jack_picche.png");
//		Card donnaDiPicche = new Card(12,"Q", "spades",true, "src/cards/donna_picche.png","src/small_cards/donna_picche.png");
//		Card kappaDiPicche = new Card(13,"K", "spades",true, "src/cards/re_picche.png","src/small_cards/re_picche.png");
//		
//		
//		CardSet carteDaAggiungereAlBaloon = new CardSet();
//		
//		CardSet altreCarteDaAggiungereAlBaloon = new CardSet();
//		
//		//altreCarteDaAggiungereAlBaloon.add(joker_clubs);
//		altreCarteDaAggiungereAlBaloon.add(joker_diamonds);
//		altreCarteDaAggiungereAlBaloon.add(assoDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(assoDiFioriB);
//		altreCarteDaAggiungereAlBaloon.add(assoDiCuori);
//		
//		
//		carteDaAggiungereAlBaloon.add(assoDiFiori);
//		carteDaAggiungereAlBaloon.add(dueDiFiori);
//		//carteDaAggiungereAlBaloon.add(treDiFiori);
//		//carteDaAggiungereAlBaloon.add(quattroDiFiori);
//		//carteDaAggiungereAlBaloon.add(cinqueDiFiori);
//		
//		
//		//altreCarteDaAggiungereAlBaloon.add(dieciDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(joker);
//		altreCarteDaAggiungereAlBaloon.add(jackDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(donnaDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(dieciDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(kappaDiPicche);
////		altreCarteDaAggiungereAlBaloon.add(assoDiPiccheB);
//
//
//        altreCarteDaAggiungereAlBaloon.add(joker2);
//		altreCarteDaAggiungereAlBaloon.add(assoDiFioriB);
//		altreCarteDaAggiungereAlBaloon.add(assoDiCuori);
//		
//		t.setCurrentPlayer(fede);
////		
////		System.out.println("\n\n Fede non dovrebbe piu avere carte in mano ");
////		int sizeCarte = t.getPlayerCardTotal(fedePosition).size();
////		
////		for(int i=0; i< sizeCarte/*(carteDaAggiungereAlBaloon.size()+altreCarteDaAggiungereAlBaloon.size())*/ ;i++){
////			System.out.println(" [Test] i="+i);
////			t.removePlayerCard(fedePosition, 0,0);
////		}
////		t.stampaCartePlayer(fedePosition);
////		System.out.println(" [Test] size carte in mano "+t.getPlayerCardTotal(fedePosition).size());
////		
//		
////		t.getPlayerCardSetList(fedePosition).removeAllCardSet();
////		CardSetList csl = new CardSetList();
////		CardSet cards = new CardSet();
////		cards.add(assoDiPicche);
////		csl.addCardSet(cards);
////		t.setPlayersCards(fedePosition, csl);
//		
////		t.addToPlayersCards(fedePosition,0, altreCarteDaAggiungereAlBaloon);
////		t.addToPlayersCards(fedePosition,0, carteDaAggiungereAlBaloon);
//		fedePA.setCardsOnHands();
//		fedePA.setMyTurnOnGraphic(true);
//		
//		//t.stampaCartePlayer(fedePosition);
//		
//		fedePA.getBaloon().stampaAllBaloon();
//		
//		carloPA.drawFromHeel();
//		carloPA.discardToWell(0);
//		fedePA.updateDiscardCard();
		
		//t.setHasLaid(fedePosition, true);
		
//	
//		fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//		//fedePA.addCardToBaloon(0);
//		//fedePA.addCardToBaloon(0);
//		
//
//		fedePA.addLineToBaloon();
//
//                
//		fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//		//fedePA.addCardToBaloon(0);
//		//fedePA.addCardToBaloon(0);
//                
//         fedePA.addLineToBaloon();
//
//        fedePA.addCardToBaloon(1);
//		fedePA.addCardToBaloon(1);
//		fedePA.addCardToBaloon(1);
//
//        fedePA.addLineToBaloon();

        //fedePA.removeLevelFromBaloon(0);
        
//        t.stampaCarteSulTavolo();
        
//        fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//		fedePA.addCardToBaloon(0);
//
		
//		fedePA.putDownBaloon();
//		
//		fedePA.setCardsOnHands();
//
//		
//		fedePA.tryToAddOrRepleaceCard(3, 0);
//		fedePA.tryToAddOrRepleaceCard(0, 1);
        
//                
//		System.out.println(" ==================  TEST  ===================");
//		System.out.println(" Tento di aggiungere la carta "+t.getPlayerCardSet(fedePosition, 0).getCard(0).getSymbol()+" "+t.getPlayerCardSet(fedePosition, 0).getCard(0).getSuit());
//		System.out.println("   al cardSet che inizia per  " + t.getCardSetOnTheTable(1).getCard(0).getSymbol()+" "+t.getCardSetOnTheTable(1).getCard(0).getSuit());
//		fedePA.tryToAddOrRepleaceCard(0, 1);
		
//		fedePA.matchWin();
//		
//
//		
//		System.out.println(" *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
//		System.out.println(" -------------------- STAMPA DI TUTTO IL TAVOLO ---------------");
//		System.out.println(" *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
//		t.stampaTuttoTavolo();
		
//		System.out.println(" FEDE VUOLE SCARTARE LA CARTA "+ table.getPlayerCard(table.getPlayerPosition(fede), 0).getCard(0).getSymbol() +" "+table.getPlayerCard(table.getPlayerPosition(fede), 0).getCard(0).getSuit());
//		
//		fedePA.discardToWell(0);
		
		// ---------------------------------- //
		

	

//		PlayerActions carloPA = new PlayerActions(carlo);
//		
//		fedePA.dealCards();
//		fedePA.drawFromHeel();
//
//		System.out.println("voglio scartare la carta " +table.getPlayersCards().get(0).getCardSet(0).getCard(11).getSymbol());
//		fedePA.discardToWell(11);
//		
//		table.setHasLaid(1, true);
//		carloPA.drawFromWell();
//		
//		
//		Card assoDiFiori = new Card(1, "A", "clubs", true);
//		Card dueDiFiori = new Card(2, "2", "clubs", true);
//		Card treDiFiori = new Card(3, "3", "clubs", true);
//		Card quattroDiFiori = new Card(4, "4", "clubs", true);
//		
//		Card assoDiFioriB = new Card(1, "A", "clubs", false);
//		Card assoDiCuori = new Card(1, "A", "hearts", true);
//		Card assoDiPicche = new Card(1, "A", "spades", true);
//		
//		CardSet carteDaAggiungereAlBaloon = new CardSet();
//		carteDaAggiungereAlBaloon.add(assoDiFiori);
//		carteDaAggiungereAlBaloon.add(dueDiFiori);
//		carteDaAggiungereAlBaloon.add(treDiFiori);
//		carteDaAggiungereAlBaloon.add(quattroDiFiori);
//		
//		CardSet altreCarteDaAggiungereAlBaloon = new CardSet();
//		altreCarteDaAggiungereAlBaloon.add(assoDiPicche);
//		altreCarteDaAggiungereAlBaloon.add(assoDiFioriB);
//		altreCarteDaAggiungereAlBaloon.add(assoDiCuori);
//		
//		
//		for(int i=0; i<(carteDaAggiungereAlBaloon.size()+altreCarteDaAggiungereAlBaloon.size());i++){
//			table.removePlayerCard(table.getPlayerPosition(fedePA), 0,i);
//		}
//		
//		table.addToPlayersCards(table.getPlayerPosition(fedePA),0, carteDaAggiungereAlBaloon);
//		table.addToPlayersCards(table.getPlayerPosition(fedePA),0, altreCarteDaAggiungereAlBaloon);
//		
//		table.stampaCartePlayer(table.getPlayerPosition(fedePA));
//		
//		ArrayList<Integer> cardPositions=new ArrayList<Integer>();
//		cardPositions.add(6);
//		cardPositions.add(7);
//		cardPositions.add(8);
//		cardPositions.add(9);
//		fedePA.addCardsToBaloon(cardPositions);
//		
//		ArrayList<Integer> cardPositionsDue=new ArrayList<Integer>();
//		cardPositionsDue.add(6);
//		cardPositionsDue.add(7);
//		cardPositionsDue.add(8);		
//		fedePA.addCardsToBaloon(cardPositionsDue);
		

		
		
		
	}
}
